﻿// 临界区.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include <Windows.h>

/*
临界区：
		临界区是指在并发程序中访问共享资源的代码段，这些代码段需要被互斥执行，以避免出现竞态条件和数据不一致的问题。在临界区中，只允许一个进程或线程访问共享资源，
		其他进程或线程必须等待当前进程或线程完成访问后才能进入临界区。临界区通常使用互斥锁、信号量或其他同步机制来实现。
	1. 定义临界区   CRITICAL_SECTION
	2. 初始化临界区 InitializeCriticalSection
	3. 进入临界区   EnterCriticalSection
	4. 离开临界区   LeaveCriticalSection
	5. 删除临界区   DeleteCriticalSection

	临界区一般搭配互斥锁一起使用


*/
#define ISF 1
#define ISFC 0

int n = 0;

CRITICAL_SECTION critical_section;

#if ISF
void f()
{
	for (int i = 0; i < 50000000; i++)
	{
		EnterCriticalSection(&critical_section);		//进入临界区
		n++;
		LeaveCriticalSection(&critical_section);		//离开临界区
	}
}
#endif

#if ISFC
void fc1()
{
	while (1)
	{
		EnterCriticalSection(&critical_section);		//进入临界区
		printf("fc1——————\n");
		Sleep(1000);
		LeaveCriticalSection(&critical_section);		//离开临界区
	}
}
void fc2()
{
	while (1)
	{
		EnterCriticalSection(&critical_section);		//进入临界区
		printf("fc1——————\n");
		Sleep(1000);
		LeaveCriticalSection(&critical_section);		//离开临界区
	}
}
#endif

int main()
{

	//初始化临界区：
	InitializeCriticalSection(&critical_section);



	//创建线程： 
#if ISF
	HANDLE h1 = CreateThread(NULL, NULL,
		(LPTHREAD_START_ROUTINE)f,
		NULL, NULL, NULL);
	HANDLE h2 = CreateThread(NULL, NULL,
		(LPTHREAD_START_ROUTINE)f,
		NULL, NULL, NULL);



	WaitForSingleObject(h1, INFINITE);
	WaitForSingleObject(h2, INFINITE);
#endif

#if ISFC
	HANDLE h1 = CreateThread(NULL, NULL,
		(LPTHREAD_START_ROUTINE)fc1,
		NULL, NULL, NULL);

	HANDLE h2 = CreateThread(NULL, NULL,
		(LPTHREAD_START_ROUTINE)fc2,
		NULL, NULL, NULL);



	WaitForSingleObject(h1, INFINITE);
	WaitForSingleObject(h2, INFINITE);
#endif
	printf("n:%d\n", n);        //没有任何方案的话，n最终的值不可能是100000000；

	//删除临界区：
	LeaveCriticalSection(&critical_section);

	return 0;
}


